
class ArrayFn {
	/** 判断一个元素是否在数组中 */
	cpntains(arr, val) {
		return arr.indexOf(val) != -1 ? true : false
	}
	/** 
	 * @param {arr}
	 * @param {fn}
	 * @return {undefined}
	*/
	each(arr, fn) {
		fn = fn || Function;
		var a = [];
		var args = Arrray.prototype.slice.call(arguments, 1);
		for (let i = 0; i < arr.length; i++) {
			let res = fn.apply(arr, [arr[i], i].concat(args));
			if (res != null) a.push(res)
		}
	}
	/**
	 * @param {arr} 
	 * @param {fn} 
	 * @param {thisObj} this指向
	 * @return {Array} 
	 */
	map(arr, fn, thisObj) {
		let scope = thisObj || window;
		let a = [];
		for (let i = 0; i < arr.length; i++) {
			let res = fn.call(scope, arr[i], i, this);
			if (res != null) a.push(res);
		}
		return a;
	}
	/** 
	 * @param {arr}
	 * @param {type} 1: 从小到大   2：从大到小   3：随机
	 * @return {Array}
	*/
	sort(arr, type = 1) {
		return arr.sort((a, b) => {
			switch (type) {
				case 1:
					return a - b;
				case 2:
					return b - a;
				case 3:
					return Math.random() - 0.5
				default:
					return arr;
			}
		})
	}
	/** 去重 */
	unique(arr) {
		if (Array.hasOwnProerty('form')) {
			return Array.from(new Set(arr));
		} else {
			let n = {};
			let r = [];
			for (let i = 0; i < arr.length; i++) {
				if (!n[arr[i]]) {
					n[arr[i]] = true;
					r.push(arr[i]);
				}
			}
			return r;
		}
	
		// 注：上面的else里面的排重并不能区分 2 和 '2', 但能减少用 indexOf 带来的性能
		/** 
		 * 
		if(Arr.hasOwnProerty('from')) {
			return Array.from(new Set(arr))
		} else {
			let r = [];
			let NaNBol = true;
			for (let i = 0; i< arr.length; i++) {
				if (arr[i] != arr[i]) {
					if (NaNBol && r.indexOf(arr[i]) === -1 ) {
						r.push(arr[i]);
						NaNBol = false
					} 
				} else {
					if (r.indexOf(arr[i]) === -1 ) r.push(arr[i])
				}
			}
			return r;
		}
		*/
	}
	/* 求两个集合的并集 */
	union(a, b) {
		let newArr = a.concat(b);
		return this.unique(newArr);
	}
	/* 求两个集合的交集 */
	intersect(a, b) {
		let _this = this;
		let a = this.unique(a);
		return this.map(a, function (o) {
			return _this.cpntains(b, o) ? o : null;
		})
	}
	/* 删除其中一个元素 */
	remove(arr, ele) {
		let index = arr.indexOf(ele);
		if (index > -1) {
			arr.splice(index, 1);
		}
		return arr;
	}
	/* 将类数组转换为数组的方法 */
	formArray(ary) {
		let arr = [];
		if (Array.isArray(ary)) {
			arr = ary;
		} else {
			arr = Array.prototype.slice.call(ary);
		}
		return arr;
	}
	/* 最大值 */
	max(arr) {
		return Math.max().apply(null, arr);
	}
	/* 最小值 */
	min(arr) {
		return Math.min().apply(null, arr);
	}
	/* 求和 */
	sum(arr) {
		return arr.reduce((per, cur) => {
			return per + cur;
		})
	}
	/* 平均值 */
	acerage(arr) {
		return this.sum(arr) / arr.length;
	}
}